<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: 使用可视模式 (选择一个文本区域)</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/visual.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>visual</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="visual.txt">visual.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2023年2月


                  <code class="vim">VIM 参考手册    by Bram Moolenaar</code>
                                <code class="vim">译者</code>: quhongjun


可视模式                                <b class="vimtag"> <a name="Visual">Visual</a> </b> <b class="vimtag"> <a name="Visual-mode">Visual-mode</a> </b> <b class="vimtag"> <a name="visual-mode">visual-mode</a> </b>

可视模式提供一种灵活易用的方法选择一块文本供操作符使用。它也是选择一个文本列块
的唯一方法。

关于本章的介绍包含在用户手册的  <a href="usr_04.html#04.4">04.4</a>  节中。

1. 使用可视模式                          <a href="visual.html#visual-use">visual-use</a> 
2. 进入和退出可视模式                    <a href="visual.html#visual-start">visual-start</a> 
3. 改变可视区域                          <a href="visual.html#visual-change">visual-change</a> 
4. 操作可视区域                          <a href="visual.html#visual-operators">visual-operators</a> 
5. 列块操作                              <a href="visual.html#blockwise-operators">blockwise-operators</a> 
6. 重复                                  <a href="visual.html#visual-repeat">visual-repeat</a> 
7. 示例                                  <a href="visual.html#visual-examples">visual-examples</a> 
8. 选择模式                              <a href="visual.html#Select-mode">Select-mode</a> 

<code class="notvi">{仅当编译时打开  <a href="various.html#+visual">+visual</a>  特性才有效}</code>
{Vim 7.4.200 开始，总是包含  <a href="various.html#+visual">+visual</a>  特性}

</section><hr class="doubleline" /><section class=inner>
<h4>1. 使用可视模式                                         <b class="vimtag"> <a name="visual-use">visual-use</a> </b></h4>
使用可视模式包含三个部分:
1. 用 "v"、"V" 或 <code class="keystroke">CTRL-V</code> 标记文本的开始。
   当前光标下的字符将被作为标记的起始点。
2. 把光标移到要标记的文本末尾。
   起始点和光标之间的文本 (包括当前光标下的字符) 将被高亮显示。
3. 键入操作符命令。
   操作符命令将被应用到高亮显示的字符。

<a href="options.html#'highlight'">'highlight'</a> 选项用来设置可视模式下的高亮显示方式。
<a href="options.html#'virtualedit'">'virtualedit'</a> 选项用来设置是否允许光标停留在没有字符的位置。

通常高亮显示的文本包括当前光标下的字符。
然而，如果 <a href="options.html#'selection'">'selection'</a> 选项被设置为 "exclusive"，并且当前光标位于可视区域之
后，那么光标下的字符将不被包括。

使用 "v" 命令，被高亮的文本将不包括起始点之前和结束点之后的字符。然而，所有的
大写命令和非字母命令 ("~" 和 "U" 除外) 仍将作用在整行上。请参考下面的操作命令
列表。

                                                        <b class="vimtag"> <a name="visual-block">visual-block</a> </b>
使用 <code class="keystroke">CTRL-V</code> (列块可视模式)，高亮区域是从开始点到光标之间的一个矩形区域。然而，
有些操作符仍将作用在整行上 (参见下面的列表)。修改 (c) 和替代 (s) 操作将删除高
亮区域的文本，然后从左上角开始插入。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 进入和退出可视模式                                   <b class="vimtag"> <a name="visual-start">visual-start</a> </b></h4>
                                                <b class="vimtag"> <a name="v">v</a> </b> <b class="vimtag"> <a name="characterwise-visual">characterwise-visual</a> </b>
<code class="special">[count]</code>v                进入可视模式，以字符为单位选择。
                        若带 <code class="special">[count]</code>，选择的字符数或行数和上次的可视操作使用的
                        一样，但乘以 <code class="special">[count]</code>，且从当前光标位置开始。
                        如果上次可视模式是基于块的，块宽度与高度同时乘以
                        <code class="special">[count]</code>。
                        如果没有上次可视操作，选择 <code class="special">[count]</code> 个字符，就像光标向
                        右移动 N * <code class="special">[count]</code> (<code class="vim">译者注</code>: <code class="special">[count]</code>？) 字符那样。如果
                        <a href="options.html#'selection'">'selection'</a> 不是 "exclusive"，少算一个字符。

                                                <b class="vimtag"> <a name="V">V</a> </b> <b class="vimtag"> <a name="linewise-visual">linewise-visual</a> </b>
V                       进入可视模式，以行为单位选择。
                        若带 <code class="special">[count]</code>，从当前光标位置开始，选择上次可视操作使用
                        的相同行数乘以 <code class="special">[count]</code>。如果没有前次可视操作，选择
                        <code class="special">[count]</code> 行。

                                                <b class="vimtag"> <a name="CTRL-V">CTRL-V</a> </b> <b class="vimtag"> <a name="blockwise-visual">blockwise-visual</a> </b>
<code class="special">[count]</code><code class="keystroke">CTRL-V</code>           进入列块可视模式。<code class="note">备注</code>: 在 Windows 环境中，<code class="keystroke">CTRL-V</code> 可能
                        被映射为粘贴操作，所以可能无法用来进入列块可视模式。参
                        见  <a href="gui_w32.html#CTRL-V-alternative">CTRL-V-alternative</a> 。
                        <code class="special">[count]</code> 用法同上述  <a href="visual.html#v">v</a> 。

在可视模式下，按 <code class="special">&lt;Esc&gt;</code>、点击鼠标左键或键入任意一个跳转到另外一个缓冲区的命令，
都会取消当前选择区的高亮显示，不影响任何文本。同时，在字符可视模式按 "v"、列块
可视模式按 "<code class="keystroke">CTRL-V</code>" 以及行可视模式按 "V" 将起到同样效果。按 <code class="keystroke">CTRL-Z</code> 键将终止可
视高亮显示，然后挂起当前编辑器或者启动新的外壳。 <a href="starting.html#CTRL-Z">CTRL-Z</a> 

当键入 "v"、"<code class="keystroke">CTRL-V</code>" 和 "V" 时的模式转换:       <b class="vimtag"> <a name="v_v">v_v</a> </b> <b class="vimtag"> <a name="v_CTRL-V">v_CTRL-V</a> </b> <b class="vimtag"> <a name="v_V">v_V</a> </b>
<code class="section">原有模式             "v"              "<code class="keystroke">CTRL-V</code>"               "V"        </code>

普通                可视              列块可视             行可视
可视                普通              列块可视             行可视
列块可视            可视                普通               行可视
行可视              可视              列块可视              普通

                                                <b class="vimtag"> <a name="gv">gv</a> </b> <b class="vimtag"> <a name="v_gv">v_gv</a> </b> <b class="vimtag"> <a name="reselect-Visual">reselect-Visual</a> </b>
gv                      启动可视模式，重新选择上一次的选择区和相同模式。
                        在可视模式下，该命令将交换当前和上一次选择区。
                        在可视模式下使用 "p" 或 "P" 后，本命令选择被粘贴的文
                        本。

                                                                <b class="vimtag"> <a name="gn">gn</a> </b> <b class="vimtag"> <a name="v_gn">v_gn</a> </b>
gn                      使用前次搜索模式正向搜索，就像  <a href="pattern.html#n">n</a>  一样，并启动可视模
                        式来选中匹配。
                        如果光标在匹配上，可视地选择之。
                        如果有操作符等待，在匹配上进行操作。例如，"dgn" 删除下
                        一个匹配的文本。
                        如果可视模式已激活，选择范围扩展到下一个匹配处的尾部。
                        应用 <a href="options.html#'wrapscan'">'wrapscan'</a>
                        <code class="note">注意</code>: 和  <a href="pattern.html#n">n</a>  不同，搜索方向不取决于前次搜索命令。

                                                                <b class="vimtag"> <a name="gN">gN</a> </b> <b class="vimtag"> <a name="v_gN">v_gN</a> </b>
gN                      类似于  <a href="visual.html#gn">gn</a>  但反向搜索，就像  <a href="pattern.html#N">N</a>  那样。

                                                        <b class="vimtag"> <a name="%3CLeftMouse%3E">&lt;LeftMouse&gt;</a> </b>
<code class="special">&lt;LeftMouse&gt;</code>             设置当前光标位置。如果处在可视模式，则退出可视模式。此
                        功能只有在 <a href="options.html#'mouse'">'mouse'</a> 选项包含 'n' 或 'a' 才可用。如果点
                        击位置与屏幕最后一行的距离在 <a href="options.html#'so'">'so'</a> 选项设置的范围之内，
                        屏幕文本将会上滚。同样，如果点击位置与屏幕第一行的距离
                        在 <a href="options.html#'so'">'so'</a> 选项设置的范围之内，屏幕文本将会下滚。

                                                        <b class="vimtag"> <a name="%3CRightMouse%3E">&lt;RightMouse&gt;</a> </b>
<code class="special">&lt;RightMouse&gt;</code>            如果当前不是可视模式，则进入可视模式。光标位置和鼠标点
                        击位置之间的文本将被高亮显示。如果当前已经处于可视模
                        式，文本高亮选择区的起点或终点之一将被置为鼠标点击的位
                        置。起点或终点的选择取决于谁离点击位置更近。此功能只有
                        在 <a href="options.html#'mouse'">'mouse'</a> 选项包含 'n' 或 'a' 时才可用。

                        <code class="note">备注</code>: 当 <a href="options.html#'mousemodel'">'mousemodel'</a> 被设为 "popup"，本操作将引发
                        <code class="special">&lt;S-LeftMouse&gt;</code> 动作，而不是 <code class="special">&lt;RightMouse&gt;</code>。

                                                        <b class="vimtag"> <a name="%3CLeftRelease%3E">&lt;LeftRelease&gt;</a> </b>
<code class="special">&lt;LeftRelease&gt;</code>           如果 <code class="special">&lt;LeftRelease&gt;</code> 的位置与 <code class="special">&lt;LeftMouse&gt;</code> 不同，那么它的
                        作用等同于 <code class="special">&lt;LeftMouse&gt;</code>。在旧版本的 xterm 中，鼠标释放
                        之前是看不到所选择的区域的，除非可以访问 xterm 运行的
                        显示设置 (通过 DISPLAY 环境变量或 -display 参数)。此功
                        能只有在 <a href="options.html#'mouse'">'mouse'</a> 选项包含 'n' 或 'a' 时才可用。

<code class="special">&lt;LeftMouseNM&gt;</code>           内部鼠标代码，用于在状态行上点击以切换焦点到窗口。
<code class="special">&lt;LeftReleaseNM&gt;</code>         NM 代表 non-mappable (不可映射的)。你不能使用这些代
                        码，但在某些地方可能会看到。

如果可视模式没有激活，同时 "v"、"V" 或 <code class="keystroke">CTRL-V</code> 命令之前包含一个计数 (count)，那
么上一次选择区的大小将被作为本次选择操作的参考值。然后你可以移动选择区的结束点
并对选择区进行操作。选择区类型与上次相同 (字符选择，行选择，或列块选择)。
- 行选择模式: 行的数目与计数相乘。
- 列块模式: 行和列的数目分别与计数相乘。
- 普通可视模式，选择区在一行以内: 选择区的字符数与计数相乘。
- 普通可视模式，选择区包含多行: 行的数目与计数相乘，最后一行的字符数目与上一次
  选择区相同。
文本的起始点在光标位置。如果上一次的命令中包含了 "$" 命令来扩展高亮文本，那么
选择区将扩展到最长行的最后一列。

如果你想选取和上一次完全一样的选择区，请使用 "gv"  <a href="visual.html#gv">gv</a>   <a href="visual.html#v_gv">v_gv</a>  命令。

                                                        <b class="vimtag"> <a name="v_%3CEsc%3E">v_&lt;Esc&gt;</a> </b>
<code class="special">&lt;Esc&gt;</code>                   可视模式下: 停止可视模式。

                                                        <b class="vimtag"> <a name="v_CTRL-C">v_CTRL-C</a> </b>
<code class="keystroke">CTRL-C</code>                  可视模式下: 停止可视模式。如果插入模式等待中 (模式信息
                        显示为 "-- (插入) 可视 --")，插入模式同时被停止。

</section><hr class="doubleline" /><section class=inner>
<h4>3. 改变可视区域                                         <b class="vimtag"> <a name="visual-change">visual-change</a> </b></h4>
                                                        <b class="vimtag"> <a name="v_o">v_o</a> </b>
o                       跳到高亮文本的另一端 (Other): 当前光标位置变成高亮文本
                        的起点，光标移动到高亮文本的另一端。高亮区域保持不变。

                                                        <b class="vimtag"> <a name="v_O">v_O</a> </b>
O                       跳到高亮文本的另一端。同 "o" 命令相似，但是在列块模式
                        下，光标移动到水平方向的另一个角。如果这个角上的字符占
                        据了多个屏幕位置 (例如一个 <code class="special">&lt;Tab&gt;</code>)，那么高亮的文本区域
                        会被改变。

                                                        <b class="vimtag"> <a name="v_$">v_$</a> </b>
如果 "$" 命令和列块模式同时使用，那么高亮文本区域的右边界将取决于高亮区域中最
长的行。如果遇到一个不是直上直下的移动命令，那么这个规则将终止。

有很多命令可以移动块的结束点。但是不能使用 Ex 命令，以及其它可能改变或放弃文件
的命令。下面这些命令 (或者以它们开始的命令): "."、"&amp;"、<code class="keystroke">CTRL-^</code>、"Z"、<code class="keystroke">CTRL-]</code>、
<code class="keystroke">CTRL-T</code>、<code class="keystroke">CTRL-R</code>、<code class="keystroke">CTRL-I</code> 和 <code class="keystroke">CTRL-O</code> 将会引起铃声，但可视模式保持不变。

当切换到同一缓冲区的另外一个窗口时，目标窗口中的光标位置会被调整，以使相同的可
视区域被选中。这一点特别适合在一个窗口查看可视区域的起点，而在另一个窗口查看它
的终点。这时候可以用鼠标右键 <code class="special">&lt;RightMouse&gt;</code> (或者，当 <a href="options.html#'mousemodel'">'mousemodel'</a> 选项置为
"popup" 时，用 <code class="special">&lt;S-LeftMouse&gt;</code>) 来拖拽可视区域两端之一。

</section><hr class="doubleline" /><section class=inner>
<h4>4. 操作可视区域                                         <b class="vimtag"> <a name="visual-operators">visual-operators</a> </b></h4>
对可视区域可以使用的操作符包括:
        ~       切换大小写                                       <a href="change.html#v_%7E">v_~</a> 
        d       删除                                             <a href="change.html#v_d">v_d</a> 
        c       修改 (4)                                         <a href="change.html#v_c">v_c</a> 
        y       抽出                                             <a href="change.html#v_y">v_y</a> 
        &gt;       右移 (4)                                         <a href="change.html#v_%3E">v_&gt;</a> 
        &lt;       左移 (4)                                         <a href="change.html#v_%3C">v_&lt;</a> 
        !       通过外部命令过滤 (1)                             <a href="change.html#v_!">v_!</a> 
        =       通过 <a href="options.html#'equalprg'">'equalprg'</a> 选项的命令过滤 (1)               <a href="change.html#v_%20">v_=</a> 
        gq      按照 <a href="options.html#'textwidth'">'textwidth'</a> 指定的宽度排版行 (1)            <a href="change.html#v_gq">v_gq</a> 

可用的对象包括:
        aw      一个单词 (包括空格)                              <a href="motion.html#v_aw">v_aw</a> 
        iw      内含单词                                         <a href="motion.html#v_iw">v_iw</a> 
        aW      一个字串 (包括空格)                              <a href="motion.html#v_aW">v_aW</a> 
        iW      内含字串                                         <a href="motion.html#v_iW">v_iW</a> 
        as      一个句子 (包括空格)                              <a href="motion.html#v_as">v_as</a> 
        is      内含句子                                         <a href="motion.html#v_is">v_is</a> 
        ap      一个段落 (包括空格)                              <a href="motion.html#v_ap">v_ap</a> 
        ip      内含段落                                         <a href="motion.html#v_ip">v_ip</a> 
        ab      一个 () 块 (包括小括号)                          <a href="motion.html#v_ab">v_ab</a> 
        ib      内含 () 块                                       <a href="motion.html#v_ib">v_ib</a> 
        aB      一个 <code class="special">{}</code> 块 (包括大括号)                          <a href="motion.html#v_aB">v_aB</a> 
        iB      内含 <code class="special">{}</code> 块                                       <a href="motion.html#v_iB">v_iB</a> 
        at      一个 <code class="special">&lt;tag&gt;</code> &lt;/tag&gt; 块 (包含 tag)                  <a href="motion.html#v_at">v_at</a> 
        it      内含 <code class="special">&lt;tag&gt;</code> &lt;/tag&gt; 块                             <a href="motion.html#v_it">v_it</a> 
        a&lt;      一个 <code class="special">&lt;&gt;</code> 块 (包括 <code class="special">&lt;&gt;</code>)                             <a href="motion.html#v_a%3C">v_a&lt;</a> 
        i&lt;      内含 <code class="special">&lt;&gt;</code> 块                                       <a href="motion.html#v_i%3C">v_i&lt;</a> 
        a[      一个 [] 块 (包括 [])                             <a href="motion.html#v_a[">v_a[</a> 
        i[      内含 [] 块                                       <a href="motion.html#v_i[">v_i[</a> 
        a"      一个双引号字符串 (包括引号)                      <a href="motion.html#v_aquote">v_aquote</a> 
        i"      内含双引号字符串                                 <a href="motion.html#v_iquote">v_iquote</a> 
        a'      一个单引号字符串 (包括引号)                      <a href="motion.html#v_a'">v_a'</a> 
        i'      内含单引号字符串                                 <a href="motion.html#v_i'">v_i'</a> 
        a`      一个反引号字符串 (包括反引号)                    <a href="motion.html#v_a`">v_a`</a> 
        i`      内含反引号字符串                                 <a href="motion.html#v_i`">v_i`</a> 

其它可以使用的命令:
        :       为高亮的行启动 Ex 命令                           <a href="cmdline.html#v_:">v_:</a> 
        r       修改 (4)                                         <a href="change.html#v_r">v_r</a> 
        s       修改                                             <a href="change.html#v_s">v_s</a> 
        C       修改 (2) (4)                                     <a href="change.html#v_C">v_C</a> 
        S       修改 (2)                                         <a href="change.html#v_S">v_S</a> 
        R       修改 (2)                                         <a href="change.html#v_R">v_R</a> 
        x       删除                                             <a href="change.html#v_x">v_x</a> 
        D       删除 (3)                                         <a href="change.html#v_D">v_D</a> 
        X       删除 (2)                                         <a href="change.html#v_X">v_X</a> 
        Y       抽出 (2)                                         <a href="change.html#v_Y">v_Y</a> 
        p       放置                                             <a href="change.html#v_p">v_p</a> 
        P       放置而不覆盖寄存器                               <a href="change.html#v_P">v_P</a> 
        J       连接 (1)                                         <a href="change.html#v_J">v_J</a> 
        U       变成大写                                         <a href="change.html#v_U">v_U</a> 
        u       变成小写                                         <a href="change.html#v_u">v_u</a> 
        ^]      查找标签                                         <a href="tagsrch.html#v_CTRL-]">v_CTRL-]</a> 
        I       列块插入                                         <a href="visual.html#v_b_I">v_b_I</a> 
        A       列块添加                                         <a href="visual.html#v_b_A">v_b_A</a> 

(1): 总是应用到整行，见  <a href="visual.html#:visual_example">:visual_example</a> 。
(2): 如果不是使用 <code class="keystroke">CTRL-V</code>，应用到整行。
(3): 如果不是使用 <code class="keystroke">CTRL-V</code>，应用到整行。如果使用 <code class="keystroke">CTRL-V</code>，删除到行尾。
(4): 如果使用 <code class="keystroke">CTRL-V</code>，只对列块操作。

<code class="note">注意</code> ":vmap" 可以进行可视模式下的键盘映射。例如，如果你不想让 "/" 命令扩展选择
区，而是将高亮的文本作为关键字进行搜索，可以这样映射: 
<code class="example">        :vmap / y/&lt;C-R&gt;"&lt;CR&gt;</code>
(<code class="special">&lt;&gt;</code> 记法要求逐字键入它的内容  <a href="intro.html#%3C%3E">&lt;&gt;</a> ，同时必须在 <a href="options.html#'cpoptions'">'cpoptions'</a> 选项中移去 'B' 和
'&lt;' 标志位)

如果你想用 """ 命令指定一个寄存器，只须将寄存器命令加在操作符之前:
"v<code class="special">{move-around}</code>"xd"

如果你想给命令加上计数，只须将数字加在操作符之前: "v<code class="special">{move-around}</code>3&gt;" (向右缩进
3 次)。

                                                        <b class="vimtag"> <a name="{move-around}">{move-around}</a> </b>
<code class="special">{move-around}</code> 是任何移动命令的组合。<code class="note">注意</code> 它与 <code class="special">{motion}</code> 的区别，后者只代表
 <code class="emphasis">一个</code> 移动命令。

对可视区域的另一种操作方法是用模式中的  <a href="pattern.html#%2F\%V">/\%V</a>  项。例如，要在可视区域中把 '('
全部替代为 '#': 
<code class="example"></code>
<code class="example">        :'&lt;,'&gt;s/\%V(/#/g</code>
<code class="example"></code>
<code class="note">注意</code> 在可视模式中按 ":" 时，"'&lt;,'&gt;" 部分会自动出现。

</section><hr class="doubleline" /><section class=inner>
<h4>5. 列块操作                                             <b class="vimtag"> <a name="blockwise-operators">blockwise-operators</a> </b></h4>
提醒: 尝试打开 <a href="options.html#'virtualedit'">'virtualedit'</a> 选项，以便列块选择的起点和终点可以超越一行的结尾
或位于制表符的中间。

列块插入                                                        <b class="vimtag"> <a name="v_b_I">v_b_I</a> </b>
对一个列块可视模式下的选择区，I<code class="special">{string}</code><code class="special">&lt;ESC&gt;</code> 命令将会从选择区开始的位置在每一
行插入字符串 <code class="special">{string}</code>。但是只有那些和选择区有交集的行才会被插入，因此过短的行
将不受影响。如果选择区包含制表符，制表符将会被分开，以维持选择区的可视列不变。
只适用于给一行增加文本，而不是删除。见  <a href="visual.html#v_b_I_example">v_b_I_example</a> 。

列块添加                                                        <b class="vimtag"> <a name="v_b_A">v_b_A</a> </b>
对一个列块可视模式下的选择区，A<code class="special">{string}</code><code class="special">&lt;ESC&gt;</code> 命令将会从选择区结束处开始在每一
行插入字符串 <code class="special">{string}</code>。当行的长短不同的时候，将导致选择区的右边界不是直线，这
时候列块添加操作的行为就会有所不同:
1. 如果列块是用 <code class="special">&lt;C-v&gt;</code>$ 命令产生的:
    这种情况下字符串被附加到每一行的结尾。
2. 如果列块是用 <code class="special">&lt;C-v&gt;</code><code class="special">{move-around}</code> 命令产生的:
    这种情况下字符串将被附加到每一行列块的结尾。对于比较短的行，行尾和列块结尾
    列之间将以空白填充。
见  <a href="visual.html#v_b_A_example">v_b_A_example</a> 。
<code class="note">备注</code>: 对于那些由于过短而没有扩展到选择区的行，"I" 和 "A" 的操作结果是不同的。
这样的设计是有意的，以便你能够选择自己所希望的操作。
只适用于给一行增加文本，而不是删除。见  <a href="visual.html#v_b_I_example">v_b_I_example</a> 。

列块修改 (c)                                                    <b class="vimtag"> <a name="v_b_c">v_b_c</a> </b>
选择区的所有文本将被相同的字符串代替。当使用 "c" 命令的时候选择区的文本将被删
除，然后进入插入模式。这时候你可以键入不带回车的文本。当你按 <code class="special">&lt;Esc&gt;</code> 的时候所键
入的文本将被插入选择区的每一行。

列块修改 (C)                                                    <b class="vimtag"> <a name="v_b_C">v_b_C</a> </b>
同 "c" 命令，但是选择区将扩展到每一行的结尾。

                                                                <b class="vimtag"> <a name="v_b_%3C">v_b_&lt;</a> </b>
列块平移                                                        <b class="vimtag"> <a name="v_b_%3E">v_b_&gt;</a> </b>
列块按照 <a href="options.html#'shiftwidth'">'shiftwidth'</a> 指定的单位移动。与块的右边界无关。块的左边界决定了从哪一
点开始右移，填充的空白根据 <a href="options.html#'ts'">'ts'</a> 和 <a href="options.html#'et'">'et'</a> 设置的宽度最优化制表符的使用方式。而块
的左边界决定了左移的终止点。
见  <a href="visual.html#v_b_%3E_example">v_b_&gt;_example</a> 。
见  <a href="visual.html#v_b_%3C_example">v_b_&lt;_example</a> 。

列块替换                                                        <b class="vimtag"> <a name="v_b_r">v_b_r</a> </b>
高亮区域的每个字符被同一个字符代替。制表符将被分割，虚拟空白字符也将被替换，以
保持屏幕布局。
见  <a href="visual.html#v_b_r_example">v_b_r_example</a> 。


</section><hr class="doubleline" /><section class=inner>
<h4>6. 重复                                                 <b class="vimtag"> <a name="visual-repeat">visual-repeat</a> </b></h4>
当重复一个可视模式操作时，该操作将被应用到与上次操作相同数量的文本上:
- 行可视模式: 相同数量的行。
- 列块可视模式: 相同数量的行和列。
- 选择区在一行之内的普通可视模式: 相同数量的字符。
- 跨越多行的普通可视模式: 相同数量的行，最后一行的字符数与上次相同。
重复操作的起始点在当前光标位置。如果重复的命令中包含 "$" 命令来扩展选择区，那
么重复操作将应用到最长行的最右一列。不使用传递给  <a href="repeat.html#.">.</a>  命令的计数。


</section><hr class="doubleline" /><section class=inner>
<h4>7. 示例                                                 <b class="vimtag"> <a name="visual-examples">visual-examples</a> </b></h4>
                                                        <b class="vimtag"> <a name=":visual_example">:visual_example</a> </b>
目前 ":" 命令只能作用在一整行。当你选择某一行的一部分，执行一个类似 ":!date"
的命令，命令输出将替换当前行的全部。如果你只想让它替换行的一部分，则必须做一个
映射。在将来的版本中，":" 可能可以作用于行的一部分。

下面这个示例能够用 "date" 命令的输出替换所选择的文本: 
<code class="example">        :vmap _a &lt;Esc&gt;`&gt;a&lt;CR&gt;&lt;Esc&gt;`&lt;i&lt;CR&gt;&lt;Esc&gt;!!date&lt;CR&gt;kJJ</code>
<code class="example"></code>
(<code class="special">&lt;&gt;</code> 记法要求逐字键入它的内容  <a href="intro.html#%3C%3E">&lt;&gt;</a> ，同时必须在 <a href="options.html#'cpoptions'">'cpoptions'</a> 选项中移去 'B' 和
'&lt;' 标志位)

它所做的是:
<code class="special">&lt;Esc&gt;</code>           停止可视模式
`&gt;              移动到可视区域的结尾
a<code class="special">&lt;CR&gt;</code><code class="special">&lt;Esc&gt;</code>      在可视区域的结尾断行
`&lt;              跳到可视区域的开始
i<code class="special">&lt;CR&gt;</code><code class="special">&lt;Esc&gt;</code>      在可视区域的起点断行
!!date<code class="special">&lt;CR&gt;</code>      通过 date 命令过滤可视文本
kJJ             把行重新连接起来

                                                        <b class="vimtag"> <a name="visual-search">visual-search</a> </b>
下面这个键盘映射能够将当前的选择区作为关键字进行搜索: 
<code class="example">        :vmap X y/&lt;C-R&gt;"&lt;CR&gt;</code>
<code class="example"></code>
(<code class="special">&lt;&gt;</code> 记法要求逐字键入它的内容  <a href="intro.html#%3C%3E">&lt;&gt;</a> ，同时必须在 <a href="options.html#'cpoptions'">'cpoptions'</a> 选项中移去 'B' 和
'&lt;' 标志位)

<code class="note">注意</code> 某些特殊字符 (例如 '.' 和 '*') 可能会引起问题。

列块可视模式示例                                        <b class="vimtag"> <a name="blockwise-examples">blockwise-examples</a> </b>
在下面的示例中，我将说明列块操作命令以及命令所执行的结果。在所有的示例中，光标
起始点位于测试文本第一行的 'a' 字符上。
假定使用模式行的设置为: ":ts=8:sw=4:"。

另外，进行这样的设置将有助于显示操作细节:
:set hls
/<code class="special">&lt;TAB&gt;</code>
这里的 <code class="special">&lt;TAB&gt;</code> 是一个真正的 TAB (即按下 Tab 键)。

测试文本是:

abcdefghijklmnopqrstuvwxyz
abc             defghijklmnopqrstuvwxyz
abcdef  ghi             jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

1. fo<code class="special">&lt;C-v&gt;</code>3jISTRING<code class="special">&lt;ESC&gt;</code>                                        <b class="vimtag"> <a name="v_b_I_example">v_b_I_example</a> </b>

abcdefghijklmnSTRINGopqrstuvwxyz
abc           STRING  defghijklmnopqrstuvwxyz
abcdef  ghi   STRING    jklmnopqrstuvwxyz
abcdefghijklmnSTRINGopqrstuvwxyz

2. fo<code class="special">&lt;C-v&gt;</code>3j$ASTRING<code class="special">&lt;ESC&gt;</code>                                       <b class="vimtag"> <a name="v_b_A_example">v_b_A_example</a> </b>

abcdefghijklmnopqrstuvwxyzSTRING
abc             defghijklmnopqrstuvwxyzSTRING
abcdef  ghi             jklmnopqrstuvwxyzSTRING
abcdefghijklmnopqrstuvwxyzSTRING

3. fo<code class="special">&lt;C-v&gt;</code>3j3l&lt;..                                               <b class="vimtag"> <a name="v_b_%3C_example">v_b_&lt;_example</a> </b>

abcdefghijklmnopqrstuvwxyz
abc           defghijklmnopqrstuvwxyz
abcdef  ghi   jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

4. fo<code class="special">&lt;C-v&gt;</code>3j&gt;..                                                 <b class="vimtag"> <a name="v_b_%3E_example">v_b_&gt;_example</a> </b>

abcdefghijklmn            opqrstuvwxyz
abc                         defghijklmnopqrstuvwxyz
abcdef  ghi                         jklmnopqrstuvwxyz
abcdefghijklmn            opqrstuvwxyz

5. fo<code class="special">&lt;C-v&gt;</code>5l3jrX                                                <b class="vimtag"> <a name="v_b_r_example">v_b_r_example</a> </b>

abcdefghijklmnXXXXXXuvwxyz
abc           XXXXXXhijklmnopqrstuvwxyz
abcdef  ghi   XXXXXX    jklmnopqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz

</section><hr class="doubleline" /><section class=inner>
<h4>8. 选择模式                                             <b class="vimtag"> <a name="Select">Select</a> </b> <b class="vimtag"> <a name="Select-mode">Select-mode</a> </b></h4>
选择模式看起来与可视模式非常相似，但是在选择模式所接受的命令与可视模式有很大不
同。它类似于 Microsoft Windows 上的选择模式。如果 <a href="options.html#'showmode'">'showmode'</a> 选项打开，处于选
择模式的时候在屏幕底端会显示 "-- 选择 --"。

进入选择模式的几种方法:
- 使用鼠标选择一片区域，同时 <a href="options.html#'selectmode'">'selectmode'</a> 选项包含 "mouse"。<a href="options.html#'mouse'">'mouse'</a> 必须包含对
  应当前模式的标志位。
- 在按下 Shift 键的同时，键入不可显示的光标移动命令，同时 <a href="options.html#'selectmode'">'selectmode'</a> 选项包
  含 "key"。例如: <code class="special">&lt;S-Left&gt;</code> 和 <code class="special">&lt;S-End&gt;</code>。<a href="options.html#'keymodel'">'keymodel'</a> 选项也必须包含 "startsel"。
- 键入 "v"、"V" 或 <code class="keystroke">CTRL-V</code> 命令，同时 <a href="options.html#'selectmode'">'selectmode'</a> 选项包含 "cmd"。
- 在普通模式键入 "gh"、"gH" 或 "g_<code class="keystroke">CTRL-H</code>" 命令。
- 在可视模式，键入 <code class="keystroke">CTRL-G</code>。                             <b class="vimtag"> <a name="v_CTRL-G">v_CTRL-G</a> </b>

选择模式的命令:
- 所有可显示字符、<code class="special">&lt;NL&gt;</code> 和 <code class="special">&lt;CR&gt;</code> 将删除当前的选择区，然后进入插入模式。插入键入
  的字符。
- 键入不可显示移动命令的同时，按下 Shift 键，将扩展当前的选择区。
  <a href="options.html#'keymodel'">'keymodel'</a> 选项必须包含 "startsel"。
- 键入不可显示移动命令的同时， <code class="emphasis">没有</code> 按下 Shift 键，将退出选择模式。
  <a href="options.html#'keymodel'">'keymodel'</a> 选项必须包含 "stopsel"。
- 按 ESC 键退出选择模式。
- <code class="keystroke">CTRL-O</code> 临时切换到可视模式执行一个命令。               <b class="vimtag"> <a name="v_CTRL-O">v_CTRL-O</a> </b>
- <code class="keystroke">CTRL-G</code> 切换到可视模式。
- <code class="keystroke">CTRL-R</code> <code class="special">{register}</code> 选择键入文本时文本被删除的寄存器。            <b class="vimtag"> <a name="v_CTRL-R">v_CTRL-R</a> </b>
  除非指定的是 "_" (黑洞) 寄存器，无名寄存器也被覆盖。

除此之外，所有键入字符的处理方式与可视模式相同。

如果选择模式是按行选择，那么在选择模式使用操作符时，所选中的行将被作为操作对
象，但是作用的方式与按字符选择相同。举例来说: 如果删除了一整行，之后它可以被粘
贴到另一行的中间。


选择模式中的键盘映射和菜单                              <b class="vimtag"> <a name="Select-mode-mapping">Select-mode-mapping</a> </b>

 <a href="map.html#:vmap">:vmap</a>  或  <a href="gui.html#:vmenu">:vmenu</a>  命令定义的映射和菜单可以同时用于可视模式和选择模式。如果用
于选择模式，Vim 自动切换到可视模式，以便执行与可视模式相同的操作。如果你不希望
这样，可以使用  <a href="map.html#:xmap">:xmap</a>  或者  <a href="map.html#:smap">:smap</a> 。

一个特别的特例: 
<code class="example">        :vnoremap &lt;C-K&gt; &lt;Esc&gt;</code>
在可视模式下，这会结束可视模式，但在选择模式下却不行，因为选择模式在执行完映射
键后会恢复选择模式。为此，要用: 
<code class="example">        :snoremap &lt;C-K&gt; &lt;Esc&gt;</code>

用户一般期待可显示字符会替代选择区域。所以，要避免选择模式下映射可显示字符。也
可以在  <a href="map.html#:map">:map</a>  和  <a href="map.html#:vmap">:vmap</a>  之后用  <a href="map.html#:sunmap">:sunmap</a>  来撤销选择模式下的映射。

当键盘映射或菜单命令执行完毕，Vim 回到选择模式，选择区被重新激活。除非选择区域
被删除，切换到另外一个缓冲区，或者窗口布局被改变。

当键入一个字符，将引起当前选择区被删除从而进入插入模式。插入模式的键盘映射将应
用到这个刚刚键入的字符。这可能会引起一些混淆，因为它意味着在选择模式输入的字符
使用了插入模式的映射。语言的映射与此相同。

                                                        <b class="vimtag"> <a name="gV">gV</a> </b> <b class="vimtag"> <a name="v_gV">v_gV</a> </b>
gV                      当一个选择模式的键盘映射或菜单命令被执行完毕后，不再自
                        动选择可视区域。把 gV 放在键盘映射或菜单命令的结尾即
                        可。或者至少应该在任何对选择区操作的命令之后。

                                                        <b class="vimtag"> <a name="gh">gh</a> </b>
gh                      启动字符方式的选择模式。同 "v" 命令类似，但是启动的是
                        选择模式，而不是可视模式。
                        助记: "get highlighted"。

                                                        <b class="vimtag"> <a name="gH">gH</a> </b>
gH                      启动按行选择的选择模式。同 "V" 命令类似，但是启动的是
                        选择模式，而不是可视模式。
                        助记: "get Highlighted"。

                                                        <b class="vimtag"> <a name="g_CTRL-H">g_CTRL-H</a> </b>
g <code class="keystroke">CTRL-H</code>                启动列块方式的选择模式。同 <code class="keystroke">CTRL-V</code> 命令类似，但是启动的
                        是选择模式，而不是可视模式。
                        助记: "get Highlighted"。

 vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
